/**
 * 
 */
package br.edu.catolica.sadbc.action;

import java.util.ArrayList;
import java.util.List;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;

import br.edu.catolica.sadbc.core.action.AbstractAction;
import br.edu.catolica.sadbc.core.exception.BusinessObjectException;
import br.edu.catolica.sadbc.core.exception.ValidateBusinessRulesException;
import br.edu.catolica.sadbc.entity.AtividadeDocente;
import br.edu.catolica.sadbc.entity.Usuario;
import br.edu.catolica.sadbc.entity.filter.AtividadeDocenteSearchFilter;
import br.edu.catolica.sadbc.manager.AtividadeDocenteManager;

/**
 * @author robert.resende
 *
 */
@Name(value = "atividadeDocenteAction")
public class AtividadeDocenteAction extends AbstractAction<AtividadeDocente> {
	
	@In(required = false)
	@Out(required = false)
	private AtividadeDocente atividadeDocente;
	
	@In(required = false)
	private Usuario usuarioSession;
	
	@In(required = false)
	private AtividadeDocenteSearchFilter atividadeDocenteSearchFilter;
	
	@In(required = false)
	private AtividadeDocenteManager atividadeDocenteManager;
	
	@In(required = false)
	@Out(required = false)
	private List<AtividadeDocente> atividadesDocente = new ArrayList<AtividadeDocente>();
	
	@Out(required = false)
	private List<CustomAtividadeDocente> customAtividadesDocente = new ArrayList<CustomAtividadeDocente>();
	
	private Boolean exibeDataTable = Boolean.FALSE;
	
	private Boolean exibeTotalizar = Boolean.FALSE;
	
	private Integer totalGeral = 0;
	
	public void init() {
		this.atividadeDocente = null;
		this.atividadeDocenteSearchFilter = null;
		this.atividadesDocente = new ArrayList<AtividadeDocente>();
		this.exibeDataTable = Boolean.FALSE;
		this.exibeTotalizar = Boolean.FALSE;
		this.totalGeral = 0;
	}
	
	public String salvar() {
		try {
			String retorno = this.atividadeDocenteManager.salvar(this.atividadeDocente);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public String docenteSalvar() {
		try {
			this.atividadeDocente.setDocente(this.usuarioSession.getDocente());
			String retorno = this.atividadeDocenteManager.salvar(this.atividadeDocente);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public String atualizar() {
		try {
			String retorno = this.atividadeDocenteManager.update(this.atividadeDocente);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (ValidateBusinessRulesException vbe) {
			vbe.printStackTrace();
			addMessageErro(vbe.getLocalizedMessage());
			return RESULT_FAIL;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	public String editar(AtividadeDocente atividadeDocente) {
		this.atividadeDocente = atividadeDocente;
		return RESULT_EDIT;
	}
	
	public String detalhar(AtividadeDocente atividadeDocente) {
		this.atividadeDocente = atividadeDocente;
		return RESULT_DETAIL;
	}
	
	public List<AtividadeDocente> pesquisar() {
		if (validarDadosConsulta(this.atividadeDocenteSearchFilter)) {
			this.atividadesDocente = this.atividadeDocenteManager.pesquisar(this.atividadeDocenteSearchFilter);
			if (!this.atividadesDocente.isEmpty()) {
				this.exibeDataTable = Boolean.TRUE;
				this.exibeTotalizar = Boolean.TRUE;
			} else {
				this.exibeDataTable = Boolean.FALSE;
				this.exibeTotalizar = Boolean.FALSE;
				this.atividadesDocente.clear();
				addMessageInfo("Nenhum resultado encontrado.");
			}
		}
		return this.atividadesDocente;
	}
	
	public List<AtividadeDocente> docentePesquisaAtividadesDocente() {
		if (validarDadosConsulta(this.atividadeDocenteSearchFilter)) {
			this.atividadeDocenteSearchFilter.setDocente(this.usuarioSession.getDocente());
			this.atividadesDocente = this.atividadeDocenteManager.pesquisar(this.atividadeDocenteSearchFilter);
			if (!this.atividadesDocente.isEmpty()) {
				this.exibeDataTable = Boolean.TRUE;
				this.exibeTotalizar = Boolean.TRUE;
			} else {
				this.exibeDataTable = Boolean.FALSE;
				this.exibeTotalizar = Boolean.FALSE;
				this.atividadesDocente.clear();
				addMessageInfo("Nenhum resultado encontrado.");
			}
		}
		return this.atividadesDocente;
	}
	
	public String totalizar(List<AtividadeDocente> atividadesDocente) {
		List<CustomAtividadeDocente> lista = new ArrayList<CustomAtividadeDocente>();
		CustomAtividadeDocente customAtividadeDocente = new CustomAtividadeDocente();
		for (AtividadeDocente atividadeDocente : atividadesDocente) {
			this.totalGeral += atividadeDocente.getAtividade().getPontos();

			if (lista.isEmpty()) {
				customAtividadeDocente.setAno(atividadeDocente.getAno());
				customAtividadeDocente.setSemestre(atividadeDocente.getSemestre());
				customAtividadeDocente.getAtividades().add(atividadeDocente.getAtividade());
				customAtividadeDocente.setSubTotal(atividadeDocente.getAtividade().getPontos());
			} else {
				if (customAtividadeDocente.getAno().equals(atividadeDocente.getAno())
						&& customAtividadeDocente.getSemestre().equals(atividadeDocente.getSemestre())) {
					customAtividadeDocente.getAtividades().add(atividadeDocente.getAtividade());
					customAtividadeDocente.setSubTotal(customAtividadeDocente.getSubTotal() + atividadeDocente.getAtividade().getPontos());
				} else {
					customAtividadeDocente = new CustomAtividadeDocente();
					customAtividadeDocente.setAno(atividadeDocente.getAno());
					customAtividadeDocente.setSemestre(atividadeDocente.getSemestre());
					customAtividadeDocente.getAtividades().add(atividadeDocente.getAtividade());
					customAtividadeDocente.setSubTotal(customAtividadeDocente.getSubTotal() + atividadeDocente.getAtividade().getPontos());
				}
			}
			if (!lista.contains(customAtividadeDocente)) {
				lista.add(customAtividadeDocente);
			}
		}
		
		this.customAtividadesDocente.addAll(lista);
		return "RESULT_TOTAL";
	}
	
	public String excluir(AtividadeDocente atividadeDocente) {
		try {
			String retorno = this.atividadeDocenteManager.excluir(atividadeDocente);
			addMessageInfo("Operação realizada com sucesso!");
			return retorno;
		} catch (BusinessObjectException boe) {
			boe.printStackTrace();
			addMessageErro(boe.getLocalizedMessage());
			return RESULT_FAIL;
		}
	}
	
	private boolean validarDadosConsulta(AtividadeDocenteSearchFilter atividadeDocenteSearchFilter) {
		if (atividadeDocenteSearchFilter.getAnoInicio() != null) {
			if (!(atividadeDocenteSearchFilter.getAnoInicio() >= 1970 && atividadeDocenteSearchFilter.getAnoInicio() <= 2099)) {
				addMessageErro("Ano inicial fora do limite permitido.(1970 à 2099)");
				return Boolean.FALSE;
			}
			if (atividadeDocenteSearchFilter.getAnoFim() != null) {
				if (!(atividadeDocenteSearchFilter.getAnoFim() >= atividadeDocenteSearchFilter.getAnoInicio())) {
					addMessageErro("Ano inicial maior que ano final.");
					return Boolean.FALSE;
				} else if (!(atividadeDocenteSearchFilter.getAnoFim() >= 1970 && atividadeDocenteSearchFilter.getAnoFim() <= 2099 )) {
					addMessageErro("Ano final fora do limite permitido.(1970 à 2099)");
					return Boolean.FALSE;
				}
			}
		}
		return Boolean.TRUE;
	}

	public Boolean getExibeDataTable() {
		return exibeDataTable;
	}

	public void setExibeDataTable(Boolean exibeDataTable) {
		this.exibeDataTable = exibeDataTable;
	}

	public Integer getTotalGeral() {
		return totalGeral;
	}

	public void setTotalGeral(Integer totalGeral) {
		this.totalGeral = totalGeral;
	}

	public Boolean getExibeTotalizar() {
		return exibeTotalizar;
	}

	public void setExibeTotalizar(Boolean exibeTotalizar) {
		this.exibeTotalizar = exibeTotalizar;
	}

}
